// 6stars/排列计数.cpp

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

const int MOD = 1000000007;

// 预计算阶乘
vector<long long> precomputeFactorials(int n) {
  vector<long long> factorial(n + 1);
  factorial[0] = 1;
  for (int i = 1; i <= n; ++i) {
    factorial[i] = (factorial[i - 1] * i) % MOD;
  }
  return factorial;
}

// 更新树状数组
void update(vector<int> &fenwick, int index, int delta, int size) {
  for (; index <= size; index += index & -index) {
    fenwick[index] += delta;
  }
}

// 查询树状数组前缀和
int query(const vector<int> &fenwick, int index) {
  int sum = 0;
  for (; index > 0; index -= index & -index) {
    sum += fenwick[index];
  }
  return sum;
}

// 计算给定排列的字典序排名
int main() {
  int n;
  cin >> n;
  vector<int> a(n);
  for (int i = 0; i < n; ++i) {
    cin >> a[i];
  }

  vector<long long> factorial = precomputeFactorials(n);
  long long rank = 1; // 从1开始计数

  vector<int> fenwick(n + 1, 0); // 创建树状数组
  for (int i = 1; i <= n; ++i) {
    update(fenwick, i, 1, n); // 初始化树状数组，标记所有数字为未使用
  }

  for (int i = 0; i < n; ++i) {
    // 查询小于当前数字的未使用数字数量
    int count = query(fenwick, a[i] - 1);
    rank = (rank + count * factorial[n - 1 - i]) % MOD; // 更新排名
    update(fenwick, a[i], -1, n); // 标记当前数字为已使用
  }

  cout << rank << endl; // 输出结果
  return 0;
}